Home > コンピュータ > LibreOffice > マクロ

大文字小文字の区別

新規作成日 2017-12-07
最終更新日

大文字小文字の区別

原文「Case Sensitivity

通常、Basicでは、大文字と小文字を区別しません。しかしながら、これは、必ずしも、UNOとBasicの間のコミュニケーションには適用されません。大文字と小文字を区別に関する問題を避けるために、まるでBasicが大文字と小文字の区別ができるように、UNO関連のコードを記述します。これは、他の言語へのBasicプログラムの翻訳をしやすくし、そして、Basicコードを読み込んで、理解することがより簡単になります。以下で、発生するかもしれない問題について説明します。

それらが、UNOオブジェクト・プロパティ、メソッドと構造体のメンバーで使用されるとき、大文字と小文字が異なる識別子は、同一であるとみなされます。

  Dim ALocale As New com.sun.star.lang.Locale
  alocale.language = "en"     ' Ok
  MsgBox aLocale.Language     ' Ok

これに対する例外は、com.sun.star.container.XNameAccessによってBasicプロパティが取得された場合です。先に述べたように、その名前は、API参照の中と同じように、正確に、記述する必要があります。Basicは、文字列のパラメータとして、名前を使用します。そのメソッドを使用して、com.sun.star.container.XNameAccessを呼び出すとき、それは、解釈されません。

' oNameAccessible is an object that supports XNameAccess
' oNameAccessibleは、XNameAccessをサポートするオブジェクトです。
  ' including the names "Value1", "Value2"
' 名前"Value1"、"Value2"が、含まれています。
  x = oNameAccessible.Value1 ' Ok
  y = oNameAccessible.VaLUe2 ' Runtime Error, Value2 is not written correctly
					'実行時エラー、Value2は、適切に記述されていません
 
  ' is the same as
 
  x = oNameAccessible.getByName( "Value1" ) ' Ok
  y = oNameAccessible.getByName( "VaLUe2" ) ' Runtime Error, Value2 is not written correctly
					'実行時エラー、Value2は、適切に記述されていません

例外処理

原文「Exception Handling

UNOとは異なり、Basicは例外をサポートしていません。Basicランタイム・システムによって変換され、Basicのエラーに変換されることで、UNOによって、捕えられることで、すべての例外が、投げられます。次のコードを実行すると、結果として、コードの実行を中断して、エラーメッセージを表示するBasicエラーが発生します。:

  Sub Main
      Dim oLib
      oLib = BasicLibraries.getByName( "InvalidLibraryName" )
  End Sub

例で使用されるBasicLibrariesオブジェクトには、実行オフィス・インスタンスのすべての利用可能なBasicライブラリが含まれています。BasicLibrariesに含まれているBasicライブラリは、com.sun.star.container.XNameAccessを使用して呼び出されます。 存在しないライブラリを取得しようとすると、例外が発生します。BasicLibrariesオブジェクトは、Advanced Library Organizationで更に詳細に説明されます。

getByName()を呼び出すと、次のエラーボックスが表示されます。:

未処理のUNO例外

未処理のUNO例外

しかしながら、Basicランタイム・システムは、常に、Exception型を認識することができません。ときどき、オブジェクト実装で提供される必要がある例外メッセージだけが、表示されることがあります。

Basicエラーに変換される例外は、まさに、On Error GoToコマンドを使用しているBasicエラーのように、処理することができます。:

  Sub Main
      On Error Goto ErrorHandler ' Enables error handling
					'エラー処理を有効にします
 
      Dim oLib
      oLib = BasicLibraries.getByName( "InvalidLibraryName" )
      MsgBox "After the Error"
      Exit Sub
 
  ' Label
  ErrorHandler:
      MsgBox "Error code: " + Err + Chr$(13) + Error$
      Resume Next ' Continues execution at the command following the error command
			' エラー・コマンドの後、コマンドで実行を続けます
  End Sub

例外が、発生するとき、実行は、ErrorHandlerラベルで継続されます。エラー・ハンドラーでは、いくつかのプロパティは、エラーに関する情報を取得するために使用されます。1のErrは、UNOの例外ためのエラーコードです。Error$には、エラーメッセージのテキストが含まれています。プログラムを実行すると、次のように出力されます。:

処理済みのUNOの例外

他のメッセージボックス"After the Error"は、上記のダイアログ・ボックスの後に表示されます。なぜなら、Resume Nextは、例外が投げられた行の下にあるコード行に移動します。Exit Subコマンドが、必要です。エラー・ハンドラー・コードが、再度、実行されることはありません。

リスナー

原文「Listeners

UNOの多くのインターフェイスは、リスナーが、フィードバックを取得するために、特別なリスナー・インターフェイスを実装しているリスナー・オブジェクトを登録するために、使用されます。その適切なリスナー・メソッドが呼び出されるとき、OpenOffice.org Basicは、オブジェクト実装のコンセプトをサポートしていません。その結果、CreateUnoListener()という名前の特別なRTL関数が、導入されました。それは、UNOからコール・バックすることができるメソッド名のための接頭辞を使用します。CreateUnoListener()は、メソッド名の接頭辞と適当と思われるリスナー・インターフェイスの型の名前を必要とします。 それは、リスナーを登録するために、使用することができる、このインターフェイスをサポートするオブジェクトを返します。 次の例は、com.sun.star.container.XContainerListenerをインスタンス化します。接頭辞ContListener_に注意してください。:

 Dim oListener
  oListener = CreateUnoListener( "ContListener_", "com.sun.star.container.XContainerListener"

次の手順では、リスナメソッドを実装します。この例では、リスナー・インターフェイスは、次に示す、メソッドを持っています。:

  
com.sun.star.container.XContainerListenerのメソッド
disposing() インターフェイスcom.sun.star.lang.XEventListenerに基づいたリスナーのメソッドは、すべてのリスナー・インターフェイスに含まれています。なぜなら、すべてのリスナー・インターフェイスは、この基準となるインターフェイスから派生している必要があります。com.sun.star.lang.EventObjectを取得します
elementInserted() インターフェイスcom.sun.star.container.XContainerListenerのメソッド。com.sun.star.container.ContainerEventを取得します。
elementRemoved() インターフェイスcom.sun.star.container.XContainerListenerのメソッド。ContainerEventを取得します。
elementReplaced() インターフェイスcom.sun.star.container.XContainerListenerのメソッド。com.sun.star.container.ContainerEventを取得します。

例の中では、ContListener_は、名前接頭辞として指定されています。その結果、次のsubsは、Basicで、実装する必要があります。

  • ContListener_disposing
  • ContListener_elementInserted
  • ContListener_elementRemoved
  • ContListener_elementReplaced

すべてのリスナー型は、イベントに関する情報が含まれている、対応するEvent構造体型を持っています。リスナー・メソッドが、呼び出されるとき、このEvent型のインスタンスは、パラメータとして渡されます。Basicリスナー・メソッドでは、適切なVariantパラメータをプロシージャ・ヘッダに追加することによって、これらのEventオブジェクトを評価すことができます。 次に示すコードは、この例のリスナー・メソッドを、どのように実装するかを示しています。:

  Sub ContListener_disposing( oEvent )
      MsgBox "disposing"
      MsgBox oEvent.Dbg_Properties
  End Sub
 
  Sub ContListener_elementInserted( oEvent )
      MsgBox "elementInserted"
      MsgBox oEvent.Dbg_Properties
  End Sub
 
  Sub ContListener_elementRemoved( oEvent )
      MsgBox "elementRemoved"
      MsgBox oEvent.Dbg_Properties
  End Sub
 
  Sub ContListener_elementReplaced( oEvent )
      MsgBox "elementReplaced"
      MsgBox oEvent.Dbg_Properties
  End Sub

リスナーの親インターフェイスのリスナー・メソッドを含めた、すべてのリスナー・メソッドを実装する必要があります。イベントが発生するたびに、そして、ブロードキャスターは、Basicプログラムが実行された後、長い間、破壊される場合があるため、特にdisposing()で、対応するBasic subが見つからないたびに、Basicランタイム・エラーが発生します。この状況では、Basicは、"Method not found"メッセージを表示します。どのメソッドが見つからないのか、なぜBasicがメソッドを探しているのかはわかりません。

私たちは、基本的なライブラリ・コンテナでイベントを聞き取っています。「ツール - マクロ - オーガナイザ」ダイアログでユーザーの動作で起動されるイベントのための私たちの単純な実装は、イベント構造体のDbg_Propertiesを含む、対応するリスナー・メソッド名とメッセージボックスによるメッセージボックスを表示します。disposing()メソッドのための、イベント・オブジェクトの型は、com.sun.star.lang.EventObjectです。他の全てのメソッドは、com.sun.star.container.XContainerListenerに属しています。その結果、イベント・オブジェクトの型は、com.sun.star.container.ContainerEventです。この型は、com.sun.star.lang.EventObjectから派生しています。そして、追加のコンテナに関連づけられた情報が含まれています

イベント・オブジェクトが、必要でない場合、パラメータは、実装から除外される可能性があります。例えば、disposing()メソッドは、以下の通りです:

  ' Minimal implementation of Sub disposing
  ' Subを破棄する最小限の実装
  Sub ContListener_disposing
  End Sub

リスナー・メソッドに渡されるイベント・オブジェクトは、他の構造体オブジェクトのように呼び出すことができます。次に示すコードは、elementRemoved()メソッドの拡張された実装を示しています。Library1とモジュール・ソース・コードから削除されるモジュールの名前を表示するために、それはcom.sun.star.container.ContainerEventを評価します。:

  sub ContListener_ElementRemoved( oEvent )
      MsgBox "Element " + oEvent.Accessor + " removed"
      MsgBox "Source =" + Chr$(13) + Chr$(13) + oEvent.Element
  End Sub

ユーザーが、Module1を削除するとき、次のメッセージボックスが、ContListener_ElementRemoved()によって表示されます:

ContListener_ElementRemovedメッセージ

ContListener_ElementRemovedメッセージ

ContListener_ElementRemovedイベント・コールバック

ContListener_ElementRemovedイベント・コールバック

すべての必要なリスナー・メソッドが、実装されるとき、適切なaddメソッドを呼び出すことによって、リスナーをブロードキャスター・オブジェクトに追加します。XContainerListenerを登録するために、私たちのコンテナに対応する登録メソッドは、addContainerListener()です。:

  Dim oLib
  oLib = BasicLibraries.Library1         ' Library1 must exist!
							' Library1が存在する必要があります
  oLib.addContainerListener( oListener ) ' Register the listener
							' リスナーを登録します

名をつけたスキームXSomeEventListener <> addSomeEventListener()は、OpenOffice.org APIを通して使用されます。

コンテナ・イベントのリスナーが、永続的に登録されるようになりました。コンテナ・イベントが、発生するとき、コンテナは、私たちのBasicコードで、com.sun.star.container.XContainerListenerインターフェイスの適切なメソッドを呼び出します。

このエントリーをはてなブックマークに追加